unit UnitFormServer;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, UnitServerKommunikation, UKartenspiel, mTLogZeile, mList, mTSpieler;

type
  TFormServer = class(TForm)
    mmoLog: TMemo;
    btnConnect: TButton;
    btnDisconnect: TButton;
    TimerForGame: TTimer;
    lblPort: TLabel;
    edtPort: TEdit;
    procedure btnConnectClick(Sender: TObject);
    procedure TimerForGameTimer(Sender: TObject);
    procedure btnDisconnectClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FormServer: TFormServer;
  ServerKommunikation: TServerKommunikation;
  Kartenspiel: TKartenSpiel;
  AlleSpieler: TList;

implementation

{$R *.DFM}

procedure TFormServer.btnConnectClick(Sender: TObject);
begin
        AlleSpieler := TList.create;
        randomize;
        ServerKommunikation := TServerKommunikation.create(StrToIntDef(edtPort.text,10000), AlleSpieler);
        btnConnect.Enabled := False;
        btnDisconnect.Enabled := True;
        TimerForGame.Enabled := True;
end;

procedure TFormServer.btnDisconnectClick(Sender: TObject);
begin
        AlleSpieler.destroy;
        ServerKommunikation.destroy;
        btnConnect.Enabled := True;
        btnDisconnect.Enabled := False;
        TimerForGame.Enabled := False;
        mmoLog.Clear;
end;

procedure TFormServer.TimerForGameTimer(Sender: TObject);
var
        LogZeile: TLogZeile;
        Spieler: TSpieler;
        KartenSP: TList;
        Karte: TKarte;
        i: Integer;
        wert,farbe:Integer;
begin
        while not(ServerKommunikation.getLogs.isEmpty) do
        begin
                LogZeile := ServerKommunikation.getLogs.front as TLogZeile;
                ServerKommunikation.getLogs.dequeue;
                mmoLog.Lines.Add(LogZeile.GetZeile);
                LogZeile.Destroy;
        end;
        case ServerKommunikation.getGame of
                GameStarted:
                begin
                        Kartenspiel := TKartenSpiel.create(AlleSpieler);

                        //init
                        ///Kartenspiel.Mischen;
                        Kartenspiel.Verteilen;
                        AlleSpieler.toFirst;

                        //Deck + First Card
                        while AlleSpieler.hasAccess do
                        begin
                                Spieler := AlleSpieler.getObject as TSpieler;
                                Spieler.down;
                                mmoLog.Lines.Add('Antwort vom Server (an '+Spieler.getIP+', '+IntToStr(Spieler.getPort)+'): DECK [...]');
                                ServerKommunikation.send(Spieler.getIP, Spieler.getPort, 'DECK');
                                KartenSP := Spieler.getKarten;
                                KartenSP.toFirst;
                                while KartenSP.hasAccess do
                                begin
                                        Karte := KartenSP.getObject as TKarte;
                                        ServerKommunikation.send(Spieler.getIP, Spieler.getPort, IntToStr(Karte.GetWert) + ' ' + IntToStr(Karte.getFarbe));
                                        KartenSP.next;
                                end;
                                ServerKommunikation.send(Spieler.getIP, Spieler.getPort, '.');
                                Spieler.up;
                                AlleSpieler.next;
                        end;

                        //first card
                        ServerKommunikation.sendToAll('PLAYER PC');
                        Karte := Kartenspiel.obersteKarte;
                        ServerKommunikation.sendToAll('KARTE ' + IntToStr(Karte.GetWert) + ' ' + IntToStr(Karte.getFarbe) + ' FROM PC INFO');
                        ServerKommunikation.setGame(PlayerChose);
                end;
                //Deck without first card
                Deck:
                begin
                        while AlleSpieler.hasAccess do
                        begin
                                Spieler := AlleSpieler.getObject as TSpieler;
                                Spieler.down;
                                mmoLog.Lines.Add('Antwort vom Server (an '+Spieler.getIP+', '+IntToStr(Spieler.getPort)+'): DECK [...]');
                                ServerKommunikation.send(Spieler.getIP, Spieler.getPort, 'DECK');
                                KartenSP := Spieler.getKarten;
                                KartenSP.toFirst;
                                while KartenSP.hasAccess do
                                begin
                                        Karte := KartenSP.getObject as TKarte;
                                        ServerKommunikation.send(Spieler.getIP, Spieler.getPort, IntToStr(Karte.GetWert) + ' ' + IntToStr(Karte.getFarbe));
                                        KartenSP.next;
                                end;
                                ServerKommunikation.send(Spieler.getIP, Spieler.getPort, '.');
                                Spieler.up;
                                AlleSpieler.next;
                        end;
                        ServerKommunikation.setGame(PlayerChose);
                end;
                //Chose Player on turn
                ///ERROR 2
                PlayerChose:
                begin
                        mmoLog.lines.add('Antwort vom Server (an alle): PLAYER ' + Kartenspiel.getSpielerAmZug.GetBenutzername);
                        ServerKommunikation.sendToAll('PLAYER ' + Kartenspiel.getSpielerAmZug.GetBenutzername);
                        ServerKommunikation.setGame(WaitForCard);
                end;
                //Handle Card chosen
                ///TODO 3 (Handling)
                PlayerChosedCard:
                begin
                        wert := StrToInt(Copy(ServerKommunikation.getKarte,0,1));
                        farbe := StrToInt(Copy(ServerKommunikation.getKarte,2,1));
                        if Kartenspiel.LegKarte(wert,farbe) then
                        begin
                                ServerKommunikation.sendToAll('KARTE '+IntToStr(wert)+' '+IntToStr(farbe)+' FROM '+ Kartenspiel.getSpielerAmZug.GetBenutzername+' INFO');
                                ServerKommunikation.setGame(Deck);
                        end;

                end;
                ///TODO 4 (Color)
                ///TODO 5 (Game End)
        end;
end;



end.
